#include <stdio.h>
#include <stdlib.h>
#include <conio.h> 
#include <windows.h>

void gotoxy(int x,int y)		//光标移动到（x，y）的位置 
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos); 
} 

void HideCursor()				//隐藏光标 
{
	CONSOLE_CURSOR_INFO cursor_info={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}

int bird_x,bird_y;				//小鸟的位置，x竖着，y横着 
int high,width;					//背景大小 
int score;						//反弹小鸟通过次数 
int bar_y;						//障碍物距离左边距离 
int bar_xtop;					//障碍物上部分 
int bar_xdown; 					//障碍物下部分 

void startup()					//数据初始化
{
	high  = 25;					//高 
	width = 30;					//宽 
	
	bar_y     = width;			//障碍物的位置 
	bar_xtop  = high / 4;		//障碍物的上部分 
	bar_xdown = high / 2;		//障碍物的下部分 
	
	bird_x = high  / 2;			//小鸟初始高 
	bird_y = width / 6;

	score  = 0;
	
	HideCursor();
} 
void show()						//显示界面 
{
	int i,j;
	
	gotoxy(0,0);				//光标移动到原点位置，以下重新清屏 
	for(i=0;i<=high;i++)
	{
		for(j=0;j<=width;j++)
		{
			if((i == bird_x) && (j == bird_y-1))
			printf("@");		//输出小鸟 
			if((j == bar_y) && (i <= bar_xtop || i >= bar_xdown))
			printf("*");		//输出障碍物 
			else
			printf(" ");		//输出空格 
		}
		printf("\n"); 
	}
	printf("\nscore=%d",score); //输出得分 
}

void updatewith()				//与用户输出有关 
{
	char input;					//控制小鸟移动 
	
	if (kbhit())
	{
		input = getch();
		if(input == ' ')		//按空格后小鸟向上移动三个单位 
		bird_x -= 3; 
	}
}

void updatewithout()			//与用户输出无关 
{
	Sleep(80);					//减慢运行速度 
	
	bird_x++;					//小鸟不断下降 
	
	if(bar_y > 0)
	bar_y--;
	else
	{
		int randposition = rand() % (high - 5);//障碍物开口不断变化 
		bar_xtop = randposition;
		bar_xdown = randposition + high / 4;
	
		bar_y=width-1;
	}
	
	if(bird_y == bar_y)			//判断小鸟是否成功通过 
		if((bird_x < bar_xdown) && (bird_x > bar_xtop))
			score++;
	else
		exit(0);
}
 
int main() 
{
	startup();					//数据初始化
	while(1)					//游戏循环执行 
	{
		show();					//显示界面 
		updatewith();			//与用户输出有关 
		updatewithout();		//与用户输出无关 
	} 
	return 0;
}